#include "ThreadPool.h"

// 构造函数，接收线程池中的线程数目
ThreadPool::ThreadPool(size_t num_threads) : stop(false) {
    // 创建指定数目的线程
    for (size_t i = 0; i < num_threads; ++i) {
        threads.emplace_back(
                // 在每个线程中，使用lambda表达式执行线程的主循环函数
                [this] () {
                    // 重复执行以下内容，直到线程池被停止
                    while (true) {
                        Task task;
                        {
                            // 使用unique_lock进行线程同步
                            std::unique_lock<std::mutex> lock(this->queue_mutex);

                            // 如果任务队列为空且线程池未被停止，则线程进入等待状态
                            this->condition.wait(lock, [this] () {
                                return this->stop || !this->tasks.empty();
                            });

                            // 如果线程池已被停止且任务队列为空，则线程退出循环
                            if (this->stop && this->tasks.empty()) {
                                return;
                            }

                            // 从任务队列中取出一个任务
                            task = std::move(this->tasks.front());
                            this->tasks.pop();
                        }

                        // 执行任务
                        task();
                    }
                }
        );
    }
}

// 停止线程池
ThreadPool::~ThreadPool() {
    {
        // 使用unique_lock进行线程同步
        std::unique_lock<std::mutex> lock(queue_mutex);

        // 将stop标志设置为true
        stop = true;
    }

    // 通知所有等待中的线程线程池已被停止
    condition.notify_all();

    // 等待所有线程退出
    for (auto &thread: threads) {
        thread.join();
    }
}